package org.baicaixiaozhan.tenet.reflection.aop;

import java.lang.reflect.Method;

/**
 * 实现可以是特定类型的通知（动作），例如拦截器。
 *
 * @author baicaixiaozhan
 * @since 1.0.0
 */
public interface Advice {

    /**
     * 前置通知（动作）
     *
     * @param target 目标对象
     * @param method 目标方法
     * @param args 参数
     */
    default void before(Object target, Method method, Object[] args) {}

    /**
     * 前置通知（动作）：根据返回值判断是否继续执行目标方法
     *
     * @param target 目标对象
     * @param method 目标方法
     * @param args 参数
     * @return 返回值为 true 中断执行目标方法
     */
    default Boolean interrupt(Object target, Method method, Object[] args) {
        return false;
    }

    /**
     * 后置通知（动作）
     *
     * @param target 目标对象
     * @param method 目标方法
     * @param args 参数
     */
    default void after(Object target, Method method, Object[] args) {}

    /**
     * 后置通知（动作）：成功返回给定方法后的回调
     *  @param returnValue 目标方法返回值
     * @param target 目标对象
     * @param method 目标方法
     * @param args 参数
     */
    default void afterReturning(Object returnValue, Object target, Method method, Object[] args) {}

    /**
     * 后置通知（动作）：定方法抛出异常后的回调
     *
     * @param target 目标对象
     * @param method 目标方法
     * @param args 参数
     * @param throwable 异常信息
     */
    default void afterThrowing(Object target, Method method, Object[] args, Throwable throwable) {}
}
